package 算法;

import java.util.Arrays;
import java.util.Comparator;

public class arrays {
    public static void main(String[] args) {
        /*
        Arrays   操作数组的工具类
        public static String toString(数组)  将数组拼接成一个字符串
        public static int binarySearch(数组，查找的元素)  二分法查找数组
        public static int[]copyOf(原数组，新数组的长度)   拷贝数组
        public static int[]copyofRange(原数组，起始索引，结束索引) 拷贝数组（指定范围）
        public static void fill（数组，元素）   填充数组
        public static void sort（数组）     按照默认方式进行数组排序
        public static void sort（数组，排序规则）  按照指定的规则排序
        */
//        toString(数组)  将数组拼接成一个字符串
        System.out.println("---------------Arrays.toString-------------");
        int[] arr={5, 6, 20, 3, 94, 25, 30, 25, 1, 3, 9};
        System.out.println(Arrays.toString(arr));



//        binarySearch(数组，查找的元素)  二分法查找数组
//        排序后的返回结果是负数就一定说明没找到  数组必须是升序的
//        不排序的话，即使数组中能找到相关关键字，那也有可以返回负数
//        查询不存在的数据时会在数组中找到该数据应该存在的位置并返回负值
//        例如查询2 数组为{0,1,3,4} 2应该在1,3之间，那么会返回负值-3 查询5会返回负值-5
    System.out.println("----------------Arrays.binarySearch-------------");
        System.out.println(Arrays.binarySearch(arr,20));//返回索引长度
        System.out.println(Arrays.binarySearch(arr,94));
        System.out.println(Arrays.binarySearch(arr,0));



//        copyOf(原数组，新数组的长度)   拷贝数组,超出范围会补0
        System.out.println("----------------Arrays.copyOf-------------");
        int[] newarr=Arrays.copyOf(arr,5);
        System.out.println(Arrays.toString(newarr));


//              copyofRange 包头不包尾，包左不包右
        System.out.println("----------------Arrays.copyofRange-------------");
        int[] newarr1=Arrays.copyOfRange(arr,5,8);
        System.out.println(Arrays.toString(newarr1));


//        Arrays.fill(a,b)将会把数组a的数据全部变为b
        System.out.println("----------------Arrays.fill-------------");
        Arrays.fill(arr,100);
        System.out.println(Arrays.toString(arr));

//        Arrays.sort  默认的排序为升序
        System.out.println("----------------Arrays.sort-------------");
        int[] arr1={5, 6, 20, 3, 94, 25, 30, 25, 1, 3, 9};
        Arrays.sort(arr1);
        System.out.println(Arrays.toString(arr1));


        /*
         public static void sort（数组，排序规则）  按照指定的规则排序
         参数一：数组
         参数二：排序的规则（ 第二个参数是个接口，所以在调用方法时，需要传递这个接口的实现类对象，作为排序的规则 ）
         但这个实现类只是用一次，所以没有必要单独得去写一个类，直接采用匿名内部类的方式
         细节：只能给引用类型的数组进行排序
         如果数据是基本类型的，需要变成其包装类（byte,short,int,long,char,boolean,float,double）
                                占用字节数   1    2     4    8    2            4      8
         */
        System.out.println("-------Arrays.sort 指定方式排序-------");
            Integer[]arr2={5, 6, 20, 3, 94, 25, 30, 25, 1, 3, 9};
//            切记，参数的类型要一致，Comparator<Integer>为Integer，那么arr也必须为Integer
        Arrays.sort(arr2,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1,Integer o2){
                System.out.println("-------------------------");

                System.out.println("o1:"+o1);
                System.out.println("o2:"+o2);
                return o1-o2;//升序排列   若为o2-o1则为降序排列
//                思路：通过o1-o2的正负来判断大小，若为正数则说明o1>o2放在o2后面
//                    此时通过o3-o1进行比较，若为正数则放在o1后面，若为负数，则o3再和o2比较
//                    重复以上步骤，直至数组比较完成
            }
        });
        System.out.println(Arrays.toString(arr2));
    }
    }

